<!DOCTYPE HTML>
<html lang="zh-CN">


<head>
    <meta charset="utf-8">
    <meta name="keywords" content="Tmux奇技淫巧, python,machine learning,deep learning,html,css,c,c++,cpp,cmake,ros,linux,ubuntu">
    <meta name="description" content="
Tmux奇技淫巧在日常的开发工作中，终端是我们最常用的工具之一。在终端中我们可以调用各种解释器，来执行命令，完成我们的工作。然而，对于只使用终端的默认功能的开发者来说，他们可能会错过一些强大的工具和技巧，这些工具和技巧可以大大提高工作效率">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <meta name="renderer" content="webkit|ie-stand|ie-comp">
    <meta name="mobile-web-app-capable" content="yes">
    <meta name="format-detection" content="telephone=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
    <meta name="referrer" content="no-referrer-when-downgrade">
    <!-- Global site tag (gtag.js) - Google Analytics -->


    <title>Tmux奇技淫巧 | JackWang&#39;s Blog</title>
    <link rel="icon" type="image/png" href="/favicon.png">

    <link rel="stylesheet" type="text/css" href="/libs/awesome/css/all.min.css">
    <link rel="stylesheet" type="text/css" href="/libs/materialize/materialize.min.css">
    <link rel="stylesheet" type="text/css" href="/libs/aos/aos.css">
    <link rel="stylesheet" type="text/css" href="/libs/animate/animate.min.css">
    <link rel="stylesheet" type="text/css" href="/libs/lightGallery/css/lightgallery.min.css">
    <link rel="stylesheet" type="text/css" href="/css/matery.css">
    <link rel="stylesheet" type="text/css" href="/css/my.css">

    <script src="/libs/jquery/jquery-3.6.0.min.js"></script>

<meta name="generator" content="Hexo 5.4.2">
<style>.github-emoji { position: relative; display: inline-block; width: 1.2em; min-height: 1.2em; overflow: hidden; vertical-align: top; color: transparent; }  .github-emoji > span { position: relative; z-index: 10; }  .github-emoji img, .github-emoji .fancybox { margin: 0 !important; padding: 0 !important; border: none !important; outline: none !important; text-decoration: none !important; user-select: none !important; cursor: auto !important; }  .github-emoji img { height: 1.2em !important; width: 1.2em !important; position: absolute !important; left: 50% !important; top: 50% !important; transform: translate(-50%, -50%) !important; user-select: none !important; cursor: auto !important; } .github-emoji-fallback { color: inherit; } .github-emoji-fallback img { opacity: 0 !important; }</style>
<link rel="stylesheet" href="/css/prism-tomorrow.css" type="text/css">
<link rel="stylesheet" href="/css/prism-line-numbers.css" type="text/css"></head>



   <style>
    body{
       background-image: url(https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/site/medias/background.jpg);
       background-repeat:no-repeat;
       background-size: 100% 100%;
       background-attachment:fixed;
    }
</style>



<body>
    <header class="navbar-fixed">
    <nav id="headNav" class="bg-color nav-transparent">
        <div id="navContainer" class="nav-wrapper container">
            <div class="brand-logo">
                <a href="/" class="waves-effect waves-light">
                    
                    <img src="/medias/logo.png" class="logo-img" alt="LOGO">
                    
                    <span class="logo-span">JackWang&#39;s Blog</span>
                </a>
            </div>
            

<a href="#" data-target="mobile-nav" class="sidenav-trigger button-collapse"><i class="fas fa-bars"></i></a>
<ul class="right nav-menu">
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/" class="waves-effect waves-light">
      
      <i class="fas fa-home" style="zoom: 0.6;"></i>
      
      <span>首页</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="" class="waves-effect waves-light">

      
      <i class="fas fa-book-reader" style="zoom: 0.6;"></i>
      
      <span>博客</span>
      <i class="fas fa-chevron-down" aria-hidden="true" style="zoom: 0.6;"></i>
    </a>
    <ul class="sub-nav menus_item_child ">
      
      <li>
        <a href="/tags">
          
          <i class="fas fa-tags" style="margin-top: -20px; zoom: 0.6;"></i>
          
	  <span>按标签归类文章</span>
        </a>
      </li>
      
      <li>
        <a href="/categories">
          
          <i class="fas fa-bookmark" style="margin-top: -20px; zoom: 0.6;"></i>
          
	  <span>按目录归类文章</span>
        </a>
      </li>
      
      <li>
        <a href="/archives">
          
          <i class="fas fa-archive" style="margin-top: -20px; zoom: 0.6;"></i>
          
	  <span>按日期分类文章</span>
        </a>
      </li>
      
    </ul>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/about" class="waves-effect waves-light">
      
      <i class="fas fa-user-circle" style="zoom: 0.6;"></i>
      
      <span>关于</span>
    </a>
    
  </li>
  
  <li>
    <a href="#searchModal" class="modal-trigger waves-effect waves-light">
      <i id="searchIcon" class="fas fa-search" title="搜索" style="zoom: 0.85;"></i>
    </a>
  </li>
</ul>



<div id="mobile-nav" class="side-nav sidenav">

    <div class="mobile-head bg-color">
        
        <img src="/medias/logo.png" class="logo-img circle responsive-img">
        
        <div class="logo-name">JackWang&#39;s Blog</div>
        <div class="logo-desc">
            
            JackWang的个人博客
            
        </div>
    </div>

    <ul class="menu-list mobile-menu-list">
        
        <li class="m-nav-item">
	  
		<a href="/" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-home"></i>
			
			首页
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="javascript:;">
			
				<i class="fa-fw fas fa-book-reader"></i>
			
			博客
			<span class="m-icon"><i class="fas fa-chevron-right"></i></span>
		</a>
            <ul  style="background:  ;" >
              
                <li>

                  <a href="/tags " style="margin-left:75px">
				  
				   <i class="fa fas fa-tags" style="position: absolute;left:50px" ></i>
			      
                              <span>按标签归类文章</    span>

                  </a>
                </li>
              
                <li>

                  <a href="/categories " style="margin-left:75px">
				  
				   <i class="fa fas fa-bookmark" style="position: absolute;left:50px" ></i>
			      
                              <span>按目录归类文章</    span>

                  </a>
                </li>
              
                <li>

                  <a href="/archives " style="margin-left:75px">
				  
				   <i class="fa fas fa-archive" style="position: absolute;left:50px" ></i>
			      
                              <span>按日期分类文章</    span>

                  </a>
                </li>
              
            </ul>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/about" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-user-circle"></i>
			
			关于
		</a>
          
        </li>
        
        
    </ul>
</div>


        </div>

        
    </nav>

</header>

    
<script src="/libs/cryptojs/crypto-js.min.js"></script>
<script>
    (function() {
        let pwd = '';
        if (pwd && pwd.length > 0) {
            if (pwd !== CryptoJS.SHA256(prompt('抱歉，这篇文章并不想让所有人都看到，请输入授权密码观看')).toString(CryptoJS.enc.Hex)) {
                alert('密码错误，将返回主页！');
                location.href = '/';
            }
        }
    })();
</script>




<div class="bg-cover pd-header post-cover" style="background-image: url('https://jack-1307599355.cos.ap-shanghai.myqcloud.com/tmux.png')">
    <div class="container" style="right: 0px;left: 0px;">
        <div class="row">
            <div class="col s12 m12 l12">
                <div class="brand">
                    <h1 class="description center-align post-title">Tmux奇技淫巧</h1>
                </div>
            </div>
        </div>
    </div>
</div>




<main class="post-container content">

    
    <link rel="stylesheet" href="/libs/tocbot/tocbot.css">
<style>
    #articleContent h1::before,
    #articleContent h2::before,
    #articleContent h3::before,
    #articleContent h4::before,
    #articleContent h5::before,
    #articleContent h6::before {
        display: block;
        content: " ";
        height: 100px;
        margin-top: -100px;
        visibility: hidden;
    }

    #articleContent :focus {
        outline: none;
    }

    .toc-fixed {
        position: fixed;
        top: 64px;
    }

    .toc-widget {
        width: 345px;
        padding-left: 20px;
    }

    .toc-widget .toc-title {
        padding: 35px 0 15px 17px;
        font-size: 1.5rem;
        font-weight: bold;
        line-height: 1.5rem;
    }

    .toc-widget ol {
        padding: 0;
        list-style: none;
    }

    #toc-content {
        padding-bottom: 30px;
        overflow: auto;
    }

    #toc-content ol {
        padding-left: 10px;
    }

    #toc-content ol li {
        padding-left: 10px;
    }

    #toc-content .toc-link:hover {
        color: #42b983;
        font-weight: 700;
        text-decoration: underline;
    }

    #toc-content .toc-link::before {
        background-color: transparent;
        max-height: 25px;

        position: absolute;
        right: 23.5vw;
        display: block;
    }

    #toc-content .is-active-link {
        color: #42b983;
    }

    #floating-toc-btn {
        position: fixed;
        right: 15px;
        bottom: 76px;
        padding-top: 15px;
        margin-bottom: 0;
        z-index: 998;
    }

    #floating-toc-btn .btn-floating {
        width: 48px;
        height: 48px;
    }

    #floating-toc-btn .btn-floating i {
        line-height: 48px;
        font-size: 1.4rem;
    }
</style>
<div class="row">
    <div id="main-content" class="col s12 m12 l9">
        <!-- 文章内容详情 -->
<div id="artDetail">
    <div class="card">
        <div class="card-content article-info">
            <div class="row tag-cate">
                <div class="col s7">
                    
                    <div class="article-tag">
                        
                            <a href="/tags/Tmux/">
                                <span class="chip bg-color">Tmux</span>
                            </a>
                        
                    </div>
                    
                </div>
                <div class="col s5 right-align">
                    
                    <div class="post-cate">
                        <i class="fas fa-bookmark fa-fw icon-category"></i>
                        
                            <a href="/categories/Linux%E5%AE%9E%E7%94%A8%E6%8A%80%E5%B7%A7/" class="post-category">
                                Linux实用技巧
                            </a>
                        
                    </div>
                    
                </div>
            </div>

            <div class="post-info">
                
                <div class="post-date info-break-policy">
                    <i class="far fa-calendar-minus fa-fw"></i>发布日期:&nbsp;&nbsp;
                    2023-11-01
                </div>
                

                
                <div class="post-date info-break-policy">
                    <i class="far fa-calendar-check fa-fw"></i>更新日期:&nbsp;&nbsp;
                    2023-11-01
                </div>
                

                
                <div class="info-break-policy">
                    <i class="far fa-file-word fa-fw"></i>文章字数:&nbsp;&nbsp;
                    7.9k
                </div>
                

                
                <div class="info-break-policy">
                    <i class="far fa-clock fa-fw"></i>阅读时长:&nbsp;&nbsp;
                    29 分
                </div>
                

                
                    <div id="busuanzi_container_page_pv" class="info-break-policy">
                        <i class="far fa-eye fa-fw"></i>阅读次数:&nbsp;&nbsp;
                        <span id="busuanzi_value_page_pv"></span>
                    </div>
				
            </div>
        </div>
        <hr class="clearfix">

        

        

        <div class="card-content article-card-content">
            <div id="articleContent">
                <p><img src="https://jack-1307599355.cos.ap-shanghai.myqcloud.com/tmux.png" alt="Tmux奇技淫巧"></p>
<h1 id="Tmux奇技淫巧"><a href="#Tmux奇技淫巧" class="headerlink" title="Tmux奇技淫巧"></a>Tmux奇技淫巧</h1><p>在日常的开发工作中，终端是我们最常用的工具之一。在终端中我们可以调用各种解释器，来执行命令，完成我们的工作。然而，对于只使用终端的默认功能的开发者来说，他们可能会错过一些强大的工具和技巧，这些工具和技巧可以大大提高工作效率。</p>
<p>其中一个非常有用的终端工具就是<code>Tmux</code>。<code>Tmux</code>是一个终端复用器，它允许我们在一个终端窗口中同时运行多个终端会话，并提供了许多有用的功能，如会话管理、窗口分割、窗格布局等。本文将介绍<code>Tmux</code>的基本概念和一些常用的功能，帮助读者更好地利用<code>Tmux</code>提升终端工作效率。</p>
<h2 id="1-Why-Tmux？"><a href="#1-Why-Tmux？" class="headerlink" title="1. Why Tmux？"></a>1. Why Tmux？</h2><h3 id="1-1-终端复用"><a href="#1-1-终端复用" class="headerlink" title="1.1 终端复用"></a>1.1 终端复用</h3><p>想象这样一个场景，我们通过<code>ssh</code>连接到了远程服务器之后，默认我们会连接到一个交互式解释器中（例如<code>bash</code>、<code>zsh</code>）。在同一个交互式解释器中，每次只能运行一条命令，而后等到命令运行结束之后我们才能再运行下一条命令。但很多时候，我们希望能连接到多个解释器，并行执行多个命令。</p>
<p>例如，假设你是一名软件开发者，正在进行一个大型项目的开发工作。为了方便开发，我们需要同时进行多个任务，如运行应用程序、查看日志、执行命令等。</p>
<ul>
<li>首先，你创建了一个窗口，并将其命名为”代码编辑”。在这个窗口中，你打开了代码编辑器，并开始编写项目的代码。这个窗口用于代码编辑，而为了查看终端的输出，我们还需要创建另外一个窗口</li>
<li>接下来，你创建了另一个窗口，并将其命名为”测试”。在这个窗口中，我们运行测试脚本和查看测试结果。</li>
<li>同时，你还创建了一个名为”服务器”的窗口，用于连接到远程服务器并执行一些部署和管理任务。</li>
</ul>
<p>在这个场景下，为了完成我们的开发工作，我们打开了多个不同的窗口，而每次切换窗口时都手都需要离开键盘，去点击鼠标。这样一来我们的效率就会被极大地降低。</p>
<p>想象现在有一个软件：</p>
<ul>
<li>我们可以通过它创建了一个和解释器的会话。在这个会话中，你可以同时进行多个任务，如运行应用程序、查看日志、执行命令等。</li>
<li>其次利用它我们能创建一个窗口，并将其命名为”代码编辑”。在这个窗口中，你打开了代码编辑器，并开始编写项目的代码。而后利用它，我们能将窗口水平分割成两个窗格，一个用于编辑代码，另一个用于查看终端输出。</li>
<li>接下来，你创建了另一个窗口，并将其命名为”测试”。在这个窗口中，你打开了一个终端，用于运行测试脚本和查看测试结果。你可以通过它提供的快捷键在不同的窗口之间快速切换，方便地在编写代码和运行测试之间进行切换。</li>
<li>最后，你还创建了一个名为”服务器”的窗口，用于连接到远程服务器并执行一些部署和管理任务。你可以在这个窗口中使用它提供窗格布局功能，将窗口垂直分割成两个窗格，一个用于连接到服务器，另一个用于执行命令和查看日志。</li>
</ul>
<p>通过使用这个软件，你可以在同一个终端窗口中同时进行代码编辑、测试和服务器管理等多个任务，而无需打开多个终端窗口。你可以通过它的快捷键快速切换窗口和窗格，轻松地在不同任务之间切换，提高工作效率。</p>
<p><img src="https://jack-1307599355.cos.ap-shanghai.myqcloud.com/image-20231101142446285.png" alt="将一个窗口分为多个窗格，分别运行不同的命令"></p>
<h3 id="1-2-持久性会话"><a href="#1-2-持久性会话" class="headerlink" title="1.2 持久性会话"></a>1.2 持久性会话</h3><p>另外一个场景是，假设你正在远程连接到一台服务器，并需要在该服务器上运行一个需要较长时间才能完成的任务，比如数据处理、模型训练或后台服务。</p>
<ul>
<li>那么我们连接到服务器并启动任务后，并希望在断开<code>SSH</code>连接后继续运行。这意味着即使你的<code>SSH</code>会话中断或你关闭了终端窗口，任务仍会在后台继续运行。这对于长时间运行的任务非常有用，因为你不必担心任务被中断或终止。</li>
<li>但是<code>SSH</code>默认连接的终端在我们关闭<code>SSH</code>连接后就会终止运行，相应的我们还在运行的任务也会被终止。</li>
</ul>
<p>因此，在这个场景下，我们希望可以和终端进行持久性会话，这样就关闭<code>SSH</code>链接或者关闭终端窗口后再次打开，你仍然可以恢复到之前的工作状态。</p>
<p><img src="https://jack-1307599355.cos.ap-shanghai.myqcloud.com/image-20231101150400195.png" alt="SSH链接断开后命令依旧在运行"></p>
<h2 id="2-安装Tmux"><a href="#2-安装Tmux" class="headerlink" title="2. 安装Tmux"></a>2. 安装Tmux</h2><h3 id="2-1-包管理器安装"><a href="#2-1-包管理器安装" class="headerlink" title="2.1 包管理器安装"></a>2.1 包管理器安装</h3><p>在大多数<code>Linux</code>发行版中，可以使用包管理器进行安装。例如，在<code>Ubuntu</code>上，可以使用以下命令进行安装：</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> tmux
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<h3 id="2-2-手动编译安装"><a href="#2-2-手动编译安装" class="headerlink" title="2.2 手动编译安装"></a>2.2 手动编译安装</h3><p>作为追求技术的程序员，我们当然也可以手动从源码编译安装，毕竟这样更酷。而且包管理器的软件源中的版本可能比较老，因此手动编译安装也是不错的选择。</p>
<p>首先下载并解压源代码</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token function">mkdir</span> ~/opt/tmux <span class="token operator">&amp;&amp;</span> <span class="token function">cd</span> ~/opt/tmux
<span class="token function">wget</span> -c https://github.com/tmux/tmux/releases/download/3.3a/tmux-3.3a.tar.gz
<span class="token function">tar</span> xzvf tmux-3.3a.tar.gz
<span class="token function">mkdir</span> v3.3a <span class="token operator">&amp;&amp;</span> <span class="token function">mv</span> tmux* v3.3a
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>
<p>然后编译</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token function">cd</span> v3.3a/tmux-3.3a
./configure --prefix<span class="token operator">=</span>/home/jack/opt/tmux/v3.3a/
<span class="token function">make</span> -j <span class="token variable"><span class="token variable">$(</span>nproc<span class="token variable">)</span></span>
<span class="token function">make</span> <span class="token function">install</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>
<p>编译完成后，就能看到已经有<code>tmux</code>了</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token function">cd</span> <span class="token punctuation">..</span>
tree -L 2 -I tmux-3.3a
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>
<p><img src="https://jack-1307599355.cos.ap-shanghai.myqcloud.com/image-20231101145125289.png" alt="image-20231101145125289"></p>
<p>最后创建一个软连接，方便未来版本更新。</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token function">ln</span> -s v3.3a/bin bin
<span class="token function">ln</span> -s v3.3a/share share
ll
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>
<p><img src="https://jack-1307599355.cos.ap-shanghai.myqcloud.com/image-20231101145320227.png" alt="完成tmux安装"></p>
<p>PS：别忘了添加环境变量。</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token keyword">echo</span> <span class="token string">'export PATH="/home/jack/opt/tmux/bin:<span class="token variable">${PATH}</span>"'</span> <span class="token operator">>></span> ~/.zshrc
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<h2 id="3-Tmux基础概念"><a href="#3-Tmux基础概念" class="headerlink" title="3. Tmux基础概念"></a>3. Tmux基础概念</h2><p>开始之前，我们先了解下<code>Tmux</code>的基本概念：</p>
<ul>
<li><code>Tmux</code>采用<code>C/S</code>模型构建，输入<code>Tmux</code>命令就相当于链接到了<code>Tmux</code>服务器，此时默认将新建一个会话，然后会话中默认新建一个窗口，窗口中默认新建一个面板</li>
<li>当前的会话会被保存在<code>Tmux</code>服务器中，即便我们退出了这个会话，下次还可以重新连接到这个回话中，其中运行的命令不会被中断</li>
</ul>
<p><code>Tmux</code>的会话、窗口、面板之间的联系如下：</p>
<ul>
<li>一个<code>Tmux</code> <code>session</code>（会话）可以包含多个<code>window</code>（窗口），窗口默认充满会话界面，因此这些窗口中可以运行相关性不大的任务。</li>
<li>一个<code>window</code>又可以包含多个<code>pane</code>（面板），窗口下的面板，都处于同一界面下，这些面板适合运行相关性高的任务，以便同时观察到它们的运行情况。</li>
</ul>
<p><img src="https://jack-1307599355.cos.ap-shanghai.myqcloud.com/tmux01.png" alt="Tmux中会话、窗口和面板的关系"></p>
<h2 id="4-Tmux的基础使用"><a href="#4-Tmux的基础使用" class="headerlink" title="4. Tmux的基础使用"></a>4. Tmux的基础使用</h2><h3 id="4-1-会话操作"><a href="#4-1-会话操作" class="headerlink" title="4.1 会话操作"></a>4.1 会话操作</h3><h4 id="新建会话"><a href="#新建会话" class="headerlink" title="新建会话"></a>新建会话</h4><p>新建一个tmux session非常简单，语法为<code>tmux new -s session-name</code>，也可以简写为<code>tmux</code>，为了方便管理，建议指定会话名称，如下。</p>
<pre class="line-numbers language-bash"><code class="language-bash">tmux <span class="token comment" spellcheck="true"># 新建一个无名称的会话</span>
tmux new -s demo <span class="token comment" spellcheck="true"># 新建一个名称为demo的会话</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>
<blockquote>
<p>注意，<code>Tmux</code>默认是不允许session之间嵌套的，因此这个命令需要在session外使用</p>
</blockquote>
<p>进入会话后，终端的下面就会显示绿色的状态栏，其中描述了诸多信息。</p>
<p><img src="https://jack-1307599355.cos.ap-shanghai.myqcloud.com/image-20231101151121254.png" alt="新建一个名为demo的会话" style="zoom: 25%;"></p>
<h4 id="断开当前会话"><a href="#断开当前会话" class="headerlink" title="断开当前会话"></a>断开当前会话</h4><p>会话中操作了一段时间，我希望断开会话同时下次还能接着用，怎么做？此时可以使用detach命令。</p>
<pre class="line-numbers language-bash"><code class="language-bash">tmux detach <span class="token comment" spellcheck="true"># 断开当前会话，会话在后台运行</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<p>也许你觉得这个太麻烦了，是的，tmux的会话中，我们可以使用tmux快捷键了。使用快捷键组合<code>Ctrl+b</code> + <code>d</code>，三次按键就可以断开当前会话。</p>
<h4 id="进入之前的会话"><a href="#进入之前的会话" class="headerlink" title="进入之前的会话"></a>进入之前的会话</h4><p>断开会话后，想要接着上次留下的现场继续工作，就要使用到tmux的attach命令了，语法为<code>tmux attach-session -t session-name</code>，可简写为<code>tmux a -t session-name</code> 或 <code>tmux a</code>。通常我们使用如下两种方式之一即可：</p>
<pre class="line-numbers language-bash"><code class="language-bash">tmux a <span class="token comment" spellcheck="true"># 默认进入第一个会话</span>
tmux a -t demo <span class="token comment" spellcheck="true"># 进入到名称为demo的会话</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>
<h4 id="关闭会话"><a href="#关闭会话" class="headerlink" title="关闭会话"></a>关闭会话</h4><p>会话的使命完成后，一定是要关闭的。我们可以使用tmux的kill命令，kill命令有<code>kill-pane</code>、<code>kill-server</code>、<code>kill-session</code> 和 <code>kill-window</code>共四种，其中<code>kill-session</code>的语法为<code>tmux kill-session -t session-name</code>。如下：</p>
<pre class="line-numbers language-bash"><code class="language-bash">tmux kill-session -t demo <span class="token comment" spellcheck="true"># 关闭demo会话</span>
tmux kill-server <span class="token comment" spellcheck="true"># 关闭服务器，所有的会话都将关闭</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>
<h4 id="查看所有的会话"><a href="#查看所有的会话" class="headerlink" title="查看所有的会话"></a>查看所有的会话</h4><p>管理会话的第一步就是要查看所有的会话，我们可以使用如下命令：</p>
<pre class="line-numbers language-bash"><code class="language-bash">tmux list-session <span class="token comment" spellcheck="true"># 查看所有会话</span>
tmux <span class="token function">ls</span> <span class="token comment" spellcheck="true"># 查看所有会话，提倡使用简写形式</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>
<p>如果刚好处于会话中怎么办？别担心，我们可以使用对应的tmux快捷键<code>Ctrl+b</code> + <code>s</code>，此时tmux将打开一个会话列表，按上下键(⬆︎⬇︎)或者鼠标滚轮，可选中目标会话，按左右键可收起或展开会话的窗口，选中目标会话或窗口后，按回车键即可完成切换。</p>
<p><img src="http://louiszhai.github.io/docImages/tmux02.png" alt="Tmux查看所有会话"></p>
<h4 id="重命名会话"><a href="#重命名会话" class="headerlink" title="重命名会话"></a>重命名会话</h4><p><code>tmux rename-session</code>命令用于重命名会话。</p>
<pre class="line-numbers language-bash"><code class="language-bash">tmux rename-session -t 0 <span class="token operator">&lt;</span>new-name<span class="token operator">></span>
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<p>上面命令将0号会话重命名。</p>
<p>但事实上一般更常用的是重命名当前会话，所以直接使用快捷键<code>Ctrl+b</code> + <code>$</code></p>
<h3 id="4-2-窗口操作"><a href="#4-2-窗口操作" class="headerlink" title="4.2 窗口操作"></a>4.2 窗口操作</h3><h4 id="新建窗口"><a href="#新建窗口" class="headerlink" title="新建窗口"></a>新建窗口</h4><p><code>tmux new-window</code>命令用来创建新窗口。</p>
<pre class="line-numbers language-bash"><code class="language-bash">tmux new-window
<span class="token comment" spellcheck="true"># 新建一个指定名称的窗口</span>
tmux new-window -n <span class="token operator">&lt;</span>window-name<span class="token operator">></span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>
<h4 id="切换窗口"><a href="#切换窗口" class="headerlink" title="切换窗口"></a>切换窗口</h4><p><code>tmux select-window</code>命令用来切换窗口。</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token comment" spellcheck="true"># 切换到指定编号的窗口</span>
tmux select-window -t <span class="token operator">&lt;</span>window-number<span class="token operator">></span>

<span class="token comment" spellcheck="true"># 切换到指定名称的窗口</span>
tmux select-window -t <span class="token operator">&lt;</span>window-name<span class="token operator">></span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre>
<h4 id="重命名窗口"><a href="#重命名窗口" class="headerlink" title="重命名窗口"></a>重命名窗口</h4><p><code>tmux rename-window</code>命令用于为当前窗口起名（或重命名）。</p>
<pre class="line-numbers language-bash"><code class="language-bash">tmux rename-window <span class="token operator">&lt;</span>new-name<span class="token operator">></span>
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<h4 id="窗口快捷键"><a href="#窗口快捷键" class="headerlink" title="窗口快捷键"></a>窗口快捷键</h4><p>下面是一些窗口操作的快捷键。</p>
<ul>
<li><code>Ctrl+b c</code>：创建一个新窗口，状态栏会显示多个窗口的信息。</li>
<li><code>Ctrl+b p</code>：切换到上一个窗口（按照状态栏上的顺序）。</li>
<li><code>Ctrl+b n</code>：切换到下一个窗口。</li>
<li><code>Ctrl+b &lt;number&gt;</code>：切换到指定编号的窗口，其中的<code>&lt;number&gt;</code>是状态栏上的窗口编号。</li>
<li><code>Ctrl+b w</code>：从列表中选择窗口。</li>
<li><code>Ctrl+b ,</code>：窗口重命名。</li>
</ul>
<p>更多的命令就不介绍了，因为相比于使用命令来说，更常用的是直接使用快捷键。</p>
<h2 id="5-Tmux快捷键"><a href="#5-Tmux快捷键" class="headerlink" title="5. Tmux快捷键"></a>5. Tmux快捷键</h2><p>关于快捷键，首先要认识到的是：<code>tmux</code>的所有快捷键，都包含同一个前缀，默认为<code>Ctrl+b</code>，输入完前缀过后，控制台激活，命令按键才能生效。前面<code>tmux</code>会话相关的操作中，我们共用到了两个快捷键<code>Ctrl+b</code> + <code>d</code>、<code>Ctrl+b</code> + <code>s</code>，但这仅仅是冰山一角，欲窥<code>tmux</code>庞大的快捷键体系，请看下表。</p>
<h3 id="5-1-Tmux系统指令"><a href="#5-1-Tmux系统指令" class="headerlink" title="5.1 Tmux系统指令"></a>5.1 Tmux系统指令</h3><div class="table-container">
<table>
<thead>
<tr>
<th style="text-align:center">前缀</th>
<th style="text-align:center">指令</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>?</code></td>
<td style="text-align:center">显示快捷键帮助文档</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>d</code></td>
<td style="text-align:center">断开当前会话</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>D</code></td>
<td style="text-align:center">选择要断开的会话</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>Ctrl+z</code></td>
<td style="text-align:center">挂起当前会话</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>r</code></td>
<td style="text-align:center">强制重载当前会话</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>s</code></td>
<td style="text-align:center">显示会话列表用于选择并切换</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>:</code></td>
<td style="text-align:center">进入命令行模式，此时可直接输入<code>ls</code>等命令</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>[</code></td>
<td style="text-align:center">进入复制模式，按<code>q</code>退出</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>]</code></td>
<td style="text-align:center">粘贴复制模式中复制的文本</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>~</code></td>
<td style="text-align:center">列出提示信息缓存</td>
</tr>
</tbody>
</table>
</div>
<h3 id="5-2-窗口（window）指令。"><a href="#5-2-窗口（window）指令。" class="headerlink" title="5.2 窗口（window）指令。"></a>5.2 窗口（window）指令。</h3><div class="table-container">
<table>
<thead>
<tr>
<th style="text-align:center">前缀</th>
<th style="text-align:center">指令</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>c</code></td>
<td style="text-align:center">新建窗口</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>&amp;</code></td>
<td style="text-align:center">关闭当前窗口（关闭前需输入<code>y</code> or <code>n</code>确认）</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>0~9</code></td>
<td style="text-align:center">切换到指定窗口</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>p</code></td>
<td style="text-align:center">切换到上一窗口</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>n</code></td>
<td style="text-align:center">切换到下一窗口</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>w</code></td>
<td style="text-align:center">打开窗口列表，用于且切换窗口</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>,</code></td>
<td style="text-align:center">重命名当前窗口</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>.</code></td>
<td style="text-align:center">修改当前窗口编号（适用于窗口重新排序）</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>f</code></td>
<td style="text-align:center">快速定位到窗口（输入关键字匹配窗口名称）</td>
</tr>
</tbody>
</table>
</div>
<h3 id="5-3-面板（pane）指令。"><a href="#5-3-面板（pane）指令。" class="headerlink" title="5.3 面板（pane）指令。"></a>5.3 面板（pane）指令。</h3><div class="table-container">
<table>
<thead>
<tr>
<th style="text-align:center">前缀</th>
<th style="text-align:center">指令</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>"</code></td>
<td style="text-align:center">当前面板上下一分为二，下侧新建面板</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>%</code></td>
<td style="text-align:center">当前面板左右一分为二，右侧新建面板</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>x</code></td>
<td style="text-align:center">关闭当前面板（关闭前需输入<code>y</code> or <code>n</code>确认）</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>z</code></td>
<td style="text-align:center">最大化当前面板，再重复一次按键后恢复正常（v1.8版本新增）</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>!</code></td>
<td style="text-align:center">将当前面板移动到新的窗口打开（原窗口中存在两个及以上面板有效）</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>;</code></td>
<td style="text-align:center">切换到最后一次使用的面板</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>q</code></td>
<td style="text-align:center">显示面板编号，在编号消失前输入对应的数字可切换到相应的面板</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>{</code></td>
<td style="text-align:center">向前置换当前面板</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>}</code></td>
<td style="text-align:center">向后置换当前面板</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>Ctrl+o</code></td>
<td style="text-align:center">顺时针旋转当前窗口中的所有面板</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>方向键</code></td>
<td style="text-align:center">移动光标切换面板</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>o</code></td>
<td style="text-align:center">选择下一面板</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>空格键</code></td>
<td style="text-align:center">在自带的面板布局中循环切换</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>Alt+方向键</code></td>
<td style="text-align:center">以5个单元格为单位调整当前面板边缘</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>Ctrl+方向键</code></td>
<td style="text-align:center">以1个单元格为单位调整当前面板边缘（Mac下被系统快捷键覆盖）</td>
</tr>
<tr>
<td style="text-align:center"><code>Ctrl+b</code></td>
<td style="text-align:center"><code>t</code></td>
<td style="text-align:center">显示时钟</td>
</tr>
</tbody>
</table>
</div>
<p><code>tmux</code>的丝滑分屏功能正是得益于以上系统、窗口、面板的快捷指令，只要你愿意，你就可以解除任意的快捷指令，然后绑上你喜欢的指令，当然这就涉及到<code>tmux</code>的配置了。</p>
<h2 id="6-Tmux的配置文件"><a href="#6-Tmux的配置文件" class="headerlink" title="6. Tmux的配置文件"></a>6. Tmux的配置文件</h2><p>类似于<code>.bashrc</code>和<code>.zshrc</code>，tmux提供了类似的配置文件。通过编写配置文件就可以实现更加强大的功能。</p>
<p>tmux的用户级配置文件为<code>~/.tmux.conf</code>（没有的话就创建一个），修改快捷指令，只需要增加如下三行即可。如果你的主目录下还没有 <code>.tmux.conf</code> 文件，你可以使用文本编辑器创建一个新的文件并将其保存为 <code>.tmux.conf</code>。</p>
<p>配置文件使用简单的语法来定义设置和命令。每个设置或命令占据一行，可以使用 <code>#</code> 符号进行注释。</p>
<h3 id="6-0-Tmux配置文件的指令"><a href="#6-0-Tmux配置文件的指令" class="headerlink" title="6.0 Tmux配置文件的指令"></a>6.0 Tmux配置文件的指令</h3><p>在 Tmux 配置文件中，可以使用以下几类命令：</p>
<ol>
<li><p><code>set</code> 命令：用于设置各种选项和参数。可以使用 <code>set -g</code> 命令设置全局选项，使用 <code>set -u</code> 命令取消选项设置，使用 <code>set -g option value</code> 命令设置具体的选项和对应的值。例如，<code>set -g prefix C-a</code> 将前缀键设置为 <code>Ctrl+a</code>。</p>
</li>
<li><p><code>bind-key</code> 命令：用于创建键绑定，将特定的键映射到指定的命令。可以使用 <code>bind-key -n</code> 命令创建无前缀键绑定，使用 <code>bind-key</code> 命令创建带前缀键绑定。例如，<code>bind-key -n C-a new-window</code> 将 <code>Ctrl+a</code> 绑定到新建窗口的命令。</p>
</li>
<li><p><code>unbind-key</code> 命令：用于解除键绑定，取消特定键的映射。可以使用 <code>unbind-key -n</code> 命令解除无前缀键绑定，使用 <code>unbind-key</code> 命令解除带前缀键绑定。例如，<code>unbind-key -n C-a</code> 将取消 <code>Ctrl+a</code> 的绑定。</p>
</li>
<li><p><code>source-file</code> 命令：用于重新加载配置文件，使新的设置生效。可以使用 <code>source-file ~/.tmux.conf</code> 命令重新加载主配置文件。这在你编辑完配置文件后需要使更改生效时非常有用。</p>
</li>
<li><p><code>alias</code> 命令：用于创建命令别名。可以使用 <code>alias -g</code> 命令创建全局别名，使用 <code>alias</code> 命令创建局部别名。例如，<code>alias -g L "list-sessions"</code> 将 <code>L</code> 定义为 <code>list-sessions</code> 命令的别名。</p>
</li>
</ol>
<p>这些命令可以在 Tmux 配置文件中使用，用于自定义和配置 Tmux 的行为、键绑定、外观和其他选项。通过合理使用这些命令，你可以根据自己的需求创建一个适合自己的 Tmux 环境。</p>
<p>下面就介绍一些常用的配置。</p>
<h3 id="6-1-修改指令前缀"><a href="#6-1-修改指令前缀" class="headerlink" title="6.1 修改指令前缀"></a>6.1 修改指令前缀</h3><p>相信只要你用过几次tmux，就会发现<code>Ctrl+b</code>指令前缀，着实不太方便。这两个键相距太远，按键成本太高了。因此我们首先需要将它更换为距离更近的<code>Ctrl+a</code>组合键，或者不常用的 ` 键。</p>
<pre class="line-numbers language-ini"><code class="language-ini">set -g prefix C-a # 将快捷键前缀设置为Ctrl+a
unbind C-b # C-b即Ctrl+b键，unbind意味着解除绑定
bind C-a send-prefix # 绑定Ctrl+a为新的指令前缀

# 从tmux v1.6版起，支持设置第二个指令前缀
set-option -g prefix2 ` # 设置一个不常用的`键作为指令前缀，按键更快些
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>
<p>修改的<code>~/.tmux.conf</code>配置文件有如下两种方式可以令其生效：</p>
<ul>
<li>restart tmux。</li>
<li>在tmux窗口中，先按下<code>Ctrl+b</code>指令前缀，然后按下系统指令<code>:</code>，进入到命令模式后输入<code>source-file ~/.tmux.conf</code>，回车后生效。</li>
</ul>
<h3 id="6-2-加载配置文件快捷键"><a href="#6-2-加载配置文件快捷键" class="headerlink" title="6.2 加载配置文件快捷键"></a>6.2 加载配置文件快捷键</h3><p>既然快捷键如此方便，更为优雅的做法是新增一个加载配置文件的快捷键 ，这样就可以随时随地load新的配置了，如下所示。</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token comment" spellcheck="true"># 绑定快捷键为r</span>
bind r source-file ~/.tmux.conf \<span class="token punctuation">;</span> display-message <span class="token string">"Config reloaded.."</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>
<p>请特别注意，在已经创建的窗口中，即使加载了新的配置，旧的配置依然有效（只要你新加的功能没有覆盖旧的配置，因此如果你第一次绑定快捷指令为<code>x</code>键，然后又改为绑定<code>y</code>键，那么<code>x</code>和<code>y</code>都将有效），新建会话不受此影响，将直接采用新的配置。</p>
<p>既然我们已经迈出配置化的第一步，那么接下来我们可以做得更多。</p>
<h3 id="6-3-新增面板"><a href="#6-3-新增面板" class="headerlink" title="6.3 新增面板"></a>6.3 新增面板</h3><p>tmux中，使用最多的功能之一就是新增一个面板。水平方向新增面板的指令是 <code>prefix</code> + <code>"</code> ，垂直方向是 <code>prefix</code> + <code>%</code>，<code>"</code> 和 <code>%</code>需要两个键同时按下才能完成，加上指令前缀至少需要3~4次按键才能组成一个完整的指令，同时这个两个键也不够醒目和方便，因此我们可以绑定两个更常用的指令 <code>-</code>、<code>|</code>，如下所示：</p>
<pre class="line-numbers language-bash"><code class="language-bash">unbind <span class="token string">'"'</span>
bind - splitw -v -c <span class="token string">'#{pane_current_path}'</span> # 垂直方向新增面板，默认进入当前目录
unbind %
bind <span class="token operator">|</span> splitw -h -c <span class="token string">'#{pane_current_path}'</span> # 水平方向新增面板，默认进入当前目录
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>
<h3 id="6-4-开启鼠标支持"><a href="#6-4-开启鼠标支持" class="headerlink" title="6.4 开启鼠标支持"></a>6.4 开启鼠标支持</h3><p>默认情况下，tmux的多窗口之间的切换以及面板大小调整，需要输入指令才能完成，这一过程，涉及到的指令较多，而且操作麻烦，特别是面板大小调整，指令难以一步到位，这个时候开启鼠标支持就完美了。</p>
<p>对于tmux v2.1(2015.10.28)之前的版本，需加入如下配置：</p>
<pre class="line-numbers language-bash"><code class="language-bash">setw -g mode-mouse on <span class="token comment" spellcheck="true"># 支持鼠标选取文本等</span>
setw -g mouse-resize-pane on <span class="token comment" spellcheck="true"># 支持鼠标拖动调整面板的大小(通过拖动面板间的分割线)</span>
setw -g mouse-select-pane on <span class="token comment" spellcheck="true"># 支持鼠标选中并切换面板</span>
setw -g mouse-select-window on <span class="token comment" spellcheck="true"># 支持鼠标选中并切换窗口(通过点击状态栏窗口名称)</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>
<p>有的地方可能会出现<code>set-window-option</code>的写法，<code>setw</code>就是它的别名。</p>
<p>对于tmux v2.1及以上的版本，仅需加入如下配置：</p>
<pre class="line-numbers language-bash"><code class="language-bash">set-option -g mouse on <span class="token comment" spellcheck="true"># 等同于以上4个指令的效果</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<p>需要注意的是，开启鼠标支持后，iTem2默认的鼠标选中即复制功能需要同时按下 <code>Alt</code> 键，才会生效。</p>
<h3 id="6-5-快速面板切换"><a href="#6-5-快速面板切换" class="headerlink" title="6.5 快速面板切换"></a>6.5 快速面板切换</h3><p>鼠标支持确实能带来很大的便捷性，特别是对于习惯了鼠标操作的tmux新手，但对于键盘爱好者而言，这不是什么好消息，对他们而言，双手不离键盘是基本素质。</p>
<p>虽然指令前缀加<code>方向键</code>可以切换面板，但<code>方向键</code>太远，不够快，不够Geek。没关系，我们可以将面板切换升级为熟悉的<code>h</code>、<code>j</code>、<code>k</code>、<code>l</code>键位。</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token comment" spellcheck="true"># 绑定hjkl键为面板切换的上下左右键</span>
bind -r k select-pane -U <span class="token comment" spellcheck="true"># 绑定k为↑</span>
bind -r j select-pane -D <span class="token comment" spellcheck="true"># 绑定j为↓</span>
bind -r h select-pane -L <span class="token comment" spellcheck="true"># 绑定h为←</span>
bind -r l select-pane -R <span class="token comment" spellcheck="true"># 绑定l为→</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre>
<p><code>-r</code>表示可重复按键，大概500ms之内，重复的<code>h</code>、<code>j</code>、<code>k</code>、<code>l</code>按键都将有效，完美支持了快速切换的Geek需求。</p>
<p>除了上下左右外， 还有几个快捷指令可以设置。</p>
<pre class="line-numbers language-bash"><code class="language-bash">bind -r e lastp <span class="token comment" spellcheck="true"># 选择最后一个面板</span>
bind -r ^e last <span class="token comment" spellcheck="true"># 选择最后一个窗口</span>

bind -r ^u swapp -U <span class="token comment" spellcheck="true"># 与前一个面板交换位置</span>
bind -r ^d swapp -D <span class="token comment" spellcheck="true"># 与后一个面板交换位置</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre>
<h3 id="6-6-面板大小调整"><a href="#6-6-面板大小调整" class="headerlink" title="6.6 面板大小调整"></a>6.6 面板大小调整</h3><p>习惯了全键盘操作后，命令的便捷性不言而喻。既然面板切换的指令都可以升级，面板大小调整的指令自然也不能落后。如下配置就可以升级你的操作：</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token comment" spellcheck="true"># 绑定Ctrl+hjkl键为面板上下左右调整边缘的快捷指令</span>
bind -r ^k resizep -U 10 <span class="token comment" spellcheck="true"># 绑定Ctrl+k为往↑调整面板边缘10个单元格</span>
bind -r ^j resizep -D 10 <span class="token comment" spellcheck="true"># 绑定Ctrl+j为往↓调整面板边缘10个单元格</span>
bind -r ^h resizep -L 10 <span class="token comment" spellcheck="true"># 绑定Ctrl+h为往←调整面板边缘10个单元格</span>
bind -r ^l resizep -R 10 <span class="token comment" spellcheck="true"># 绑定Ctrl+l为往→调整面板边缘10个单元格</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre>
<p>以上，<code>resizep</code>即<code>resize-pane</code>的别名。</p>
<h3 id="6-7-面板最大化"><a href="#6-7-面板最大化" class="headerlink" title="6.7 面板最大化"></a>6.7 面板最大化</h3><p>当窗口中面板的数量逐渐增多时，每个面板的空间就会逐渐减少。为了保证有足够的空间显示内容，tmux从v1.8版本起，提供了面板的最大化功能，输入<code>tmux-prefix+z</code>，就可以最大化当前面板至窗口大小，只要再重复输入一次，便恢复正常。</p>
<h3 id="6-8-窗口变为面板"><a href="#6-8-窗口变为面板" class="headerlink" title="6.8 窗口变为面板"></a>6.8 窗口变为面板</h3><p>面板可以轻松地最大化为一个新的窗口。那么反过来，窗口是不是可以最小化为一个面板呢？</p>
<blockquote>
<p>试想这样一个场景：当你打开多个窗口后，然后想将其中几个窗口合并到当前窗口中，以便对比观察输出。</p>
</blockquote>
<p>实际上，你的要求就是将其它窗口变成面板，然后合并到当前窗口中。对于这种操作，我们可以在当前窗口，按下<code>prefix</code> + <code>:</code>，打开命令行，然后输入如下命令：</p>
<pre class="line-numbers language-bash"><code class="language-bash">join-pane -s window01 <span class="token comment" spellcheck="true"># 合并名称为window01的窗口的默认（第一个）面板到当前窗口中</span>
join-pane -s window01.1 <span class="token comment" spellcheck="true"># .1显式指定了第一个面板，.2就是第二个面板(我本地将面板编号起始值设置为1，默认是0)</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>
<p>每次执行<code>join-pane</code>命令都会合并一个面板，并且指定的窗口会减少一个面板，直到面板数量为0，窗口关闭。</p>
<p>除了在当前会话中操作外，<code>join-pane</code>命令甚至可以从其它指定会话中合并面板，格式为<code>join-pane -s [session_name]:[window].[pane]</code>，如<code>join-pane -s 2:1.1</code> 即合并第二个会话的第一个窗口的第一个面板到当前窗口，当目标会话的窗口和面板数量为0时，会话便会关闭。</p>
<p>注：上一节中的<code>swap-pane</code>命令与<code>join-pane</code>语法基本一致。</p>
<h3 id="6-9-其他配置"><a href="#6-9-其他配置" class="headerlink" title="6.9 其他配置"></a>6.9 其他配置</h3><pre class="line-numbers language-bash"><code class="language-bash">bind m command-prompt <span class="token string">"splitw -h 'exec man %%'"</span>   <span class="token comment" spellcheck="true"># 绑定m键为在新的panel打开man</span>
<span class="token comment" spellcheck="true"># 绑定P键为开启日志功能，如下，面板的输出日志将存储到桌面</span>
bind P pipe-pane -o <span class="token string">"cat >>~/Desktop/#W.log"</span> \<span class="token punctuation">;</span> display <span class="token string">"Toggled logging to ~/Desktop/#W.log"</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>
<h3 id="6-10-恢复用户空间"><a href="#6-10-恢复用户空间" class="headerlink" title="6.10 恢复用户空间"></a>6.10 <strong>恢复用户空间</strong></h3><p>tmux会话中，Mac的部分命令如 <code>osascript</code>、<code>open</code>、<code>pbcopy</code> 或 <code>pbpaste</code>等可能会失效（失效命令未列全）。</p>
<p>部分bug列表如下：</p>
<ul>
<li><a target="_blank" rel="noopener" href="https://apple.stackexchange.com/questions/174779/unable-to-run-display-notification-using-osascript-in-a-tmux-session">applescript - Unable to run ‘display notification’ using osascript in a tmux session</a></li>
<li><a target="_blank" rel="noopener" href="https://stackoverflow.com/questions/30404944/open-command-doesnt-work-properly-inside-tmux/30412054#30412054">osx - “open” command doesn’t work properly inside tmux</a></li>
<li><a target="_blank" rel="noopener" href="https://stackoverflow.com/questions/16618992/cant-paste-into-macvim/16661806#16661806">clipboard - Can’t paste into MacVim</a></li>
</ul>
<p>对此，我们可以通过安装<code>reattach-to-user-namespace</code>包装程序来解决这个问题。</p>
<pre class="line-numbers language-bash"><code class="language-bash">brew <span class="token function">install</span> reattach-to-user-namespace
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<p>在<code>~/.tmux.conf</code>中添加配置：</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token keyword">set</span> -g default-command <span class="token string">"reattach-to-user-namespace -l <span class="token variable">$SHELL</span>"</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<p>这样你的交互式shell最终能够重新连接到用户级的命名空间。由于连接状态能够被子进程继承，故以上配置保证了所有从 shell 启动的命令能够被正确地连接。</p>
<p>有些时候，我们可能会在不同的操作系统中共享配置文件，如果你的tmux版本大于1.9，我们还可以使用<code>if-shell</code>来判断是否Mac系统，然后再指定<code>default-command</code>。</p>
<pre class="line-numbers language-bash"><code class="language-bash">if-shell <span class="token string">'test "<span class="token variable"><span class="token variable">$(</span><span class="token function">uname</span> -s<span class="token variable">)</span></span>" = Darwin'</span> <span class="token string">'set-option -g default-command "exec reattach-to-user-namespace -l <span class="token variable">$SHELL</span>"'</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<p>对于tmux v1.8及更早的版本，可以使用如下包装后的配置：</p>
<pre class="line-numbers language-bash"><code class="language-bash">set-option -g default-command <span class="token string">'command -v reattach-to-user-namespace >/dev/null &amp;&amp; exec reattach-to-user-namespace -l "<span class="token variable">$SHELL</span>" || exec "<span class="token variable">$SHELL</span>"'</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<p>以上，<code>$SHELL</code>对应于你的默认Shell，通常是<code>/usr/bin/bash</code> 或 <code>/usr/local/bin/zsh</code>。</p>
<h2 id="7-复制模式"><a href="#7-复制模式" class="headerlink" title="7. 复制模式"></a>7. 复制模式</h2><p>tmux中操作文本，自然离不开复制模式，通常使用复制模式的步骤如下：</p>
<ol>
<li>输入 <code>`+[</code> 进入复制模式</li>
<li>按下 <code>空格键</code> 开始复制，移动光标选择复制区域</li>
<li>按下 <code>回车键</code> 复制选中文本并退出复制模式</li>
<li>按下 <code>`+]</code> 粘贴文本</li>
</ol>
<p>查看复制模式默认的快捷键风格：</p>
<pre class="line-numbers language-bash"><code class="language-bash">tmux show-window-options -g mode-keys <span class="token comment" spellcheck="true"># mode-keys emacs</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<p>默认情况下，快捷键为<code>emacs</code>风格。</p>
<p>为了让复制模式更加方便，我们可以将快捷键设置为熟悉的<code>vi</code>风格，如下：</p>
<pre class="line-numbers language-bash"><code class="language-bash">setw -g mode-keys <span class="token function">vi</span> <span class="token comment" spellcheck="true"># 开启vi风格后，支持vi的C-d、C-u、hjkl等快捷键</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<h3 id="7-1-自定义复制和选择快捷键"><a href="#7-1-自定义复制和选择快捷键" class="headerlink" title="7.1 自定义复制和选择快捷键"></a>7.1 <strong>自定义复制和选择快捷键</strong></h3><p>除了快捷键外，复制模式的启用、选择、复制、粘贴等按键也可以向<code>vi</code>风格靠拢。</p>
<pre class="line-numbers language-bash"><code class="language-bash">bind Escape copy-mode <span class="token comment" spellcheck="true"># 绑定esc键为进入复制模式</span>
bind -t vi-copy <span class="token function">v</span> begin-selection <span class="token comment" spellcheck="true"># 绑定v键为开始选择文本</span>
bind -t vi-copy y copy-selection <span class="token comment" spellcheck="true"># 绑定y键为复制选中文本</span>
bind p pasteb <span class="token comment" spellcheck="true"># 绑定p键为粘贴文本（p键默认用于进入上一个窗口，不建议覆盖）</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>
<p>以上，绑定 <code>v</code>、<code>y</code>两键的设置只在tmux v2.4版本以下才有效，对于v2.4及以上的版本，绑定快捷键需要使用 <code>-T</code> 选项，发送指令需要使用 <code>-X</code> 选项，请参考如下设置：</p>
<pre class="line-numbers language-bash"><code class="language-bash">bind -T copy-mode-vi <span class="token function">v</span> send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>
<h3 id="7-2-Buffer缓存"><a href="#7-2-Buffer缓存" class="headerlink" title="7.2 Buffer缓存"></a>7.2 <strong>Buffer缓存</strong></h3><p>tmux复制操作的内容默认会存进<code>buffer</code>里，<code>buffer</code>是一个粘贴缓存区，新的缓存总是位于栈顶，它的操作命令如下：</p>
<pre class="line-numbers language-bash"><code class="language-bash">tmux list-buffers <span class="token comment" spellcheck="true"># 展示所有的 buffers</span>
tmux show-buffer <span class="token punctuation">[</span>-b buffer-name<span class="token punctuation">]</span> <span class="token comment" spellcheck="true"># 显示指定的 buffer 内容</span>
tmux choose-buffer <span class="token comment" spellcheck="true"># 进入 buffer 选择页面(支持jk上下移动选择，回车选中并粘贴 buffer 内容到面板上)</span>
tmux set-buffer <span class="token comment" spellcheck="true"># 设置buffer内容</span>
tmux load-buffer <span class="token punctuation">[</span>-b buffer-name<span class="token punctuation">]</span> file-path <span class="token comment" spellcheck="true"># 从文件中加载文本到buffer缓存</span>
tmux save-buffer <span class="token punctuation">[</span>-a<span class="token punctuation">]</span> <span class="token punctuation">[</span>-b buffer-name<span class="token punctuation">]</span> path <span class="token comment" spellcheck="true"># 保存tmux的buffer缓存到本地</span>
tmux paste-buffer <span class="token comment" spellcheck="true"># 粘贴buffer内容到会话中</span>
tmux delete-buffer <span class="token punctuation">[</span>-b buffer-name<span class="token punctuation">]</span> <span class="token comment" spellcheck="true"># 删除指定名称的buffer</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>
<p>以上buffer操作在不指定buffer-name时，默认处理是栈顶的buffer缓存。</p>
<p>在tmux会话的命令行输入时，可以省略上述tmux前缀，其中list-buffers的操作如下所示：</p>
<p><a target="_blank" rel="noopener" href="http://louiszhai.github.io/docImages/tmux06.png"><img src="https://jack-1307599355.cos.ap-shanghai.myqcloud.com/tmux06.png" alt="list-buffers"></a></p>
<p>choose-buffer的操作如下所示：</p>
<p><a target="_blank" rel="noopener" href="http://louiszhai.github.io/docImages/tmux05.png"><img src="https://jack-1307599355.cos.ap-shanghai.myqcloud.com/tmux05.png" alt="choose-buffer"></a></p>
<p>默认情况下，buffers内容是独立于系统粘贴板的，它存在于tmux进程中，且可以在会话间共享。</p>
<h3 id="7-3-使用系统粘贴板"><a href="#7-3-使用系统粘贴板" class="headerlink" title="7.3 使用系统粘贴板"></a>7.3 <strong>使用系统粘贴板</strong></h3><p>存在于tmux进程中的buffer缓存，虽然可以在会话间共享，但不能直接与系统粘贴板共享，不免有些遗憾。幸运的是，现在我们有成熟的方案来实现这个功能。</p>
<h4 id="A-在Linux上使用粘贴板"><a href="#A-在Linux上使用粘贴板" class="headerlink" title="A. 在Linux上使用粘贴板"></a>A. <strong>在Linux上使用粘贴板</strong></h4><p>通常，Linux中可以使用<code>xclip</code>工具来接入系统粘贴板。</p>
<p>首先，需要安装<code>xclip</code>。</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> xclip
<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
<p>然后，<code>.tmux.conf</code>的配置如下。</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token comment" spellcheck="true"># buffer缓存复制到Linux系统粘贴板</span>
bind C-c run <span class="token string">" tmux save-buffer - | xclip -i -sel clipboard"</span>
<span class="token comment" spellcheck="true"># Linux系统粘贴板内容复制到会话</span>
bind C-v run <span class="token string">" tmux set-buffer \"<span class="token variable"><span class="token variable">$(</span>xclip -o -sel clipboard<span class="token variable">)</span></span>\"; tmux paste-buffer"</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>
<p>按下<code>prefix</code> + <code>Ctrl</code> + <code>c</code> 键，buffer缓存的内容将通过<code>xlip</code>程序复制到粘贴板，按下<code>prefix</code> + <code>Ctrl</code> + <code>v</code>键，tmux将通过<code>xclip</code>访问粘贴板，然后由set-buffer命令设置给buffer缓存，最后由paste-buffer粘贴到tmux会话中。</p>
<h4 id="B-在Mac上使用粘贴板"><a href="#B-在Mac上使用粘贴板" class="headerlink" title="B. 在Mac上使用粘贴板"></a>B. <strong>在Mac上使用粘贴板</strong></h4><p>我们都知道，Mac自带 <code>pbcopy</code> 和 <code>pbpaste</code>命令，分别用于复制和粘贴，但在tmux命令中它们却不能正常运行。这里我将详细介绍下原因：</p>
<blockquote>
<p>Mac的粘贴板服务是在引导命名空间注册的。命名空间存在层次之分，更高级别的命名空间拥有访问低级别命名空间（如root引导命名空间）的权限，反之却不行。流程创建的属于Mac登录会话的一部分，它会被自动包含在用户级的引导命名空间中，因此只有用户级的命名空间才能访问粘贴板服务。tmux使用守护进程(3)库函数创建其服务器进程，在Mac OS X 10.5中，苹果改变了守护进程(3)的策略，将生成的过程从最初的引导命名空间移到了根引导命名空间。而根引导命名空间访问权限较低，这意味着tmux服务器，和它的子进程，一同失去了原引导命名空间的访问权限（即无权限访问粘贴板服务）。</p>
</blockquote>
<p>如此，我们可以使用一个小小的包装程序来重新连接到合适的命名空间，然后执行访问用户级命名空间的粘贴板服务，这个包装程序就是<code>reattach-to-user-namespace</code>。</p>
<p>那么，Mac下<code>.tmux.conf</code>的配置如下：</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token comment" spellcheck="true"># buffer缓存复制到Mac系统粘贴板</span>
bind C-c run <span class="token string">"tmux save-buffer - | reattach-to-user-namespace pbcopy"</span>
<span class="token comment" spellcheck="true"># Mac系统粘贴板内容复制到会话</span>
bind C-v run <span class="token string">"reattach-to-user-namespace pbpaste | tmux load-buffer - \; paste-buffer -d"</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>
<p><code>reattach-to-user-namespace</code> 作为包装程序来访问Mac粘贴板，按下<code>prefix</code> + <code>Ctrl</code> + <code>c</code> 键，buffer缓存的内容将复制到粘贴板，按下<code>prefix</code> + <code>Ctrl</code> + <code>v</code>键，粘贴板的内容将通过 load-buffer 加载，然后由 paste-buffer 粘贴到tmux会话中。</p>
<p>为了在复制模式中使用Mac系统的粘贴板，可做如下配置：</p>
<pre class="line-numbers language-bash"><code class="language-bash"><span class="token comment" spellcheck="true"># 绑定y键为复制选中文本到Mac系统粘贴板</span>
bind-key -T copy-mode-vi <span class="token string">'y'</span> send-keys -X copy-pipe-and-cancel <span class="token string">'reattach-to-user-namespace pbcopy'</span>
<span class="token comment" spellcheck="true"># 鼠标拖动选中文本，并复制到Mac系统粘贴板</span>
bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel <span class="token string">"pbcopy"</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>
<p>完成以上配置后记得重启tmux服务器。至此，复制模式中，按<code>y</code>键将保存选中的文本到Mac系统粘贴板，随后按<code>Command</code> + <code>v</code>键便可粘贴。</p>

                
            </div>
            <hr/>

            

    <div class="reprint" id="reprint-statement">
        
            <div class="reprint__author">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-user">
                        文章作者:
                    </i>
                </span>
                <span class="reprint-info">
                    <a href="/about" rel="external nofollow noreferrer">Jack Wang</a>
                </span>
            </div>
            <div class="reprint__type">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-link">
                        文章链接:
                    </i>
                </span>
                <span class="reprint-info">
                    <a href="https://jackwang0107.github.io/2023/11/01/tmux-qi-ji-yin-qiao/">https://jackwang0107.github.io/2023/11/01/tmux-qi-ji-yin-qiao/</a>
                </span>
            </div>
            <div class="reprint__notice">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-copyright">
                        版权声明:
                    </i>
                </span>
                <span class="reprint-info">
                    本博客所有文章除特別声明外，均采用
                    <a href="https://creativecommons.org/licenses/by/4.0/deed.zh" rel="external nofollow noreferrer" target="_blank">CC BY 4.0</a>
                    许可协议。转载请注明来源
                    <a href="/about" target="_blank">Jack Wang</a>
                    !
                </span>
            </div>
        
    </div>

    <script async defer>
      document.addEventListener("copy", function (e) {
        let toastHTML = '<span>复制成功，请遵循本文的转载规则</span><button class="btn-flat toast-action" onclick="navToReprintStatement()" style="font-size: smaller">查看</a>';
        M.toast({html: toastHTML})
      });

      function navToReprintStatement() {
        $("html, body").animate({scrollTop: $("#reprint-statement").offset().top - 80}, 800);
      }
    </script>



            <div class="tag_share" style="display: block;">
                <div class="post-meta__tag-list" style="display: inline-block;">
                    
                        <div class="article-tag">
                            
                                <a href="/tags/Tmux/">
                                    <span class="chip bg-color">Tmux</span>
                                </a>
                            
                        </div>
                    
                </div>
                <div class="post_share" style="zoom: 80%; width: fit-content; display: inline-block; float: right; margin: -0.15rem 0;">
                    <link rel="stylesheet" type="text/css" href="/libs/share/css/share.min.css">
<div id="article-share">

    
    <div class="social-share" data-sites="twitter,facebook,google,qq,qzone,wechat,weibo,douban,linkedin" data-wechat-qrcode-helper="<p>微信扫一扫即可分享！</p>"></div>
    <script src="/libs/share/js/social-share.min.js"></script>
    

    

</div>

                </div>
            </div>
            
                <style>
    #reward {
        margin: 40px 0;
        text-align: center;
    }

    #reward .reward-link {
        font-size: 1.4rem;
        line-height: 38px;
    }

    #reward .btn-floating:hover {
        box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2), 0 5px 15px rgba(0, 0, 0, 0.2);
    }

    #rewardModal {
        width: 320px;
        height: 350px;
    }

    #rewardModal .reward-title {
        margin: 15px auto;
        padding-bottom: 5px;
    }

    #rewardModal .modal-content {
        padding: 10px;
    }

    #rewardModal .close {
        position: absolute;
        right: 15px;
        top: 15px;
        color: rgba(0, 0, 0, 0.5);
        font-size: 1.3rem;
        line-height: 20px;
        cursor: pointer;
    }

    #rewardModal .close:hover {
        color: #ef5350;
        transform: scale(1.3);
        -moz-transform:scale(1.3);
        -webkit-transform:scale(1.3);
        -o-transform:scale(1.3);
    }

    #rewardModal .reward-tabs {
        margin: 0 auto;
        width: 210px;
    }

    .reward-tabs .tabs {
        height: 38px;
        margin: 10px auto;
        padding-left: 0;
    }

    .reward-content ul {
        padding-left: 0 !important;
    }

    .reward-tabs .tabs .tab {
        height: 38px;
        line-height: 38px;
    }

    .reward-tabs .tab a {
        color: #fff;
        background-color: #ccc;
    }

    .reward-tabs .tab a:hover {
        background-color: #ccc;
        color: #fff;
    }

    .reward-tabs .wechat-tab .active {
        color: #fff !important;
        background-color: #22AB38 !important;
    }

    .reward-tabs .alipay-tab .active {
        color: #fff !important;
        background-color: #019FE8 !important;
    }

    .reward-tabs .reward-img {
        width: 210px;
        height: 210px;
    }
</style>

<div id="reward">
    <a href="#rewardModal" class="reward-link modal-trigger btn-floating btn-medium waves-effect waves-light red">赏</a>

    <!-- Modal Structure -->
    <div id="rewardModal" class="modal">
        <div class="modal-content">
            <a class="close modal-close"><i class="fas fa-times"></i></a>
            <h4 class="reward-title">你的赏识是我前进的动力</h4>
            <div class="reward-content">
                <div class="reward-tabs">
                    <ul class="tabs row">
                        <li class="tab col s6 alipay-tab waves-effect waves-light"><a href="#alipay">支付宝</a></li>
                        <li class="tab col s6 wechat-tab waves-effect waves-light"><a href="#wechat">微 信</a></li>
                    </ul>
                    <div id="alipay">
                        <img src="/medias/reward/alipay.png" class="reward-img" alt="支付宝打赏二维码">
                    </div>
                    <div id="wechat">
                        <img src="/medias/reward/wechat.jpg" class="reward-img" alt="微信打赏二维码">
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<script>
    $(function () {
        $('.tabs').tabs();
    });
</script>

            
        </div>
    </div>

    

    

    

    

    

    

    

    

    

<article id="prenext-posts" class="prev-next articles">
    <div class="row article-row">
        
        <div class="article col s12 m6" data-aos="fade-up">
            <div class="article-badge left-badge text-color">
                <i class="fas fa-chevron-left"></i>&nbsp;上一篇</div>
            <div class="card">
                <a href="/2023/11/22/ji-suan-ji-zu-cheng-yu-jie-gou-1/">
                    <div class="card-image">
                        
                        <img src="https://global.aorus.com/upload/Admin/images/2021_0923_gigabyte-4470.jpg" class="responsive-img" alt="计算机组成原理 1：计算机系统概述">
                        
                        <span class="card-title">计算机组成原理 1：计算机系统概述</span>
                    </div>
                </a>
                <div class="card-content article-content">
                    <div class="summary block-with-text">
                        
                            
                        
                    </div>
                    <div class="publish-info">
                        <span class="publish-date">
                            <i class="far fa-clock fa-fw icon-date"></i>2023-11-22
                        </span>
                        <span class="publish-author">
                            
                            <i class="fas fa-bookmark fa-fw icon-category"></i>
                            
                            <a href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/" class="post-category">
                                    计算机组成原理
                                </a>
                            
                            
                        </span>
                    </div>
                </div>
                
                <div class="card-action article-tags">
                    
                    <a href="/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/">
                        <span class="chip bg-color">计算机组成原理</span>
                    </a>
                    
                </div>
                
            </div>
        </div>
        
        
        <div class="article col s12 m6" data-aos="fade-up">
            <div class="article-badge right-badge text-color">
                下一篇&nbsp;<i class="fas fa-chevron-right"></i>
            </div>
            <div class="card">
                <a href="/2023/08/01/tuo-fu-xue-xi-yue-du/">
                    <div class="card-image">
                        
                        <img src="https://jack-1307599355.cos.ap-shanghai.myqcloud.com/image-20221029214115913.png" class="responsive-img" alt="托福学习：阅读">
                        
                        <span class="card-title">托福学习：阅读</span>
                    </div>
                </a>
                <div class="card-content article-content">
                    <div class="summary block-with-text">
                        
                            托福这个东西吧，有用是真有用，就是每次有效期快到了之后就得重新去考
                        
                    </div>
                    <div class="publish-info">
                            <span class="publish-date">
                                <i class="far fa-clock fa-fw icon-date"></i>2023-08-01
                            </span>
                        <span class="publish-author">
                            
                            <i class="fas fa-bookmark fa-fw icon-category"></i>
                            
                            <a href="/categories/%E8%8B%B1%E8%AF%AD%E5%AD%A6%E4%B9%A0/" class="post-category">
                                    英语学习
                                </a>
                            
                            
                        </span>
                    </div>
                </div>
                
                <div class="card-action article-tags">
                    
                    <a href="/tags/%E6%9D%82%E9%A1%B9/">
                        <span class="chip bg-color">杂项</span>
                    </a>
                    
                    <a href="/tags/%E8%8B%B1%E8%AF%AD%E5%AD%A6%E4%B9%A0/">
                        <span class="chip bg-color">英语学习</span>
                    </a>
                    
                </div>
                
            </div>
        </div>
        
    </div>
</article>

</div>


<script>
    $('#articleContent').on('copy', function (e) {
        // IE8 or earlier browser is 'undefined'
        if (typeof window.getSelection === 'undefined') return;

        var selection = window.getSelection();
        // if the selection is short let's not annoy our users.
        if (('' + selection).length < Number.parseInt('120')) {
            return;
        }

        // create a div outside of the visible area and fill it with the selected text.
        var bodyElement = document.getElementsByTagName('body')[0];
        var newdiv = document.createElement('div');
        newdiv.style.position = 'absolute';
        newdiv.style.left = '-99999px';
        bodyElement.appendChild(newdiv);
        newdiv.appendChild(selection.getRangeAt(0).cloneContents());

        // we need a <pre> tag workaround.
        // otherwise the text inside "pre" loses all the line breaks!
        if (selection.getRangeAt(0).commonAncestorContainer.nodeName === 'PRE' || selection.getRangeAt(0).commonAncestorContainer.nodeName === 'CODE') {
            newdiv.innerHTML = "<pre>" + newdiv.innerHTML + "</pre>";
        }

        var url = document.location.href;
        newdiv.innerHTML += '<br />'
            + '来源: JackWang&#39;s Blog<br />'
            + '文章作者: Jack Wang<br />'
            + '文章链接: <a href="' + url + '">' + url + '</a><br />'
            + '本文章著作权归作者所有，任何形式的转载都请注明出处。';

        selection.selectAllChildren(newdiv);
        window.setTimeout(function () {bodyElement.removeChild(newdiv);}, 200);
    });
</script>


<!-- 代码块功能依赖 -->
<script type="text/javascript" src="/libs/codeBlock/codeBlockFuction.js"></script>

<!-- 代码语言 -->

<script type="text/javascript" src="/libs/codeBlock/codeLang.js"></script>


<!-- 代码块复制 -->

<script type="text/javascript" src="/libs/codeBlock/codeCopy.js"></script>


<!-- 代码块收缩 -->

<script type="text/javascript" src="/libs/codeBlock/codeShrink.js"></script>


    </div>
    <div id="toc-aside" class="expanded col l3 hide-on-med-and-down">
        <div class="toc-widget card" style="background-color: white;">
            <div class="toc-title"><i class="far fa-list-alt"></i>&nbsp;&nbsp;目录</div>
            <div id="toc-content"></div>
        </div>
    </div>
</div>

<!-- TOC 悬浮按钮. -->

<div id="floating-toc-btn" class="hide-on-med-and-down">
    <a class="btn-floating btn-large bg-color">
        <i class="fas fa-list-ul"></i>
    </a>
</div>


<script src="/libs/tocbot/tocbot.min.js"></script>
<script>
    $(function () {
        tocbot.init({
            tocSelector: '#toc-content',
            contentSelector: '#articleContent',
            headingsOffset: -($(window).height() * 0.4 - 45),
            collapseDepth: Number('2'),
            headingSelector: 'h1, h2, h3, h4, h5, h6'
        });

        // modify the toc link href to support Chinese.
        let i = 0;
        let tocHeading = 'toc-heading-';
        $('#toc-content a').each(function () {
            $(this).attr('href', '#' + tocHeading + (++i));
        });

        // modify the heading title id to support Chinese.
        i = 0;
        $('#articleContent').children('h1, h2, h3, h4, h5, h6').each(function () {
            $(this).attr('id', tocHeading + (++i));
        });

        // Set scroll toc fixed.
        let tocHeight = parseInt($(window).height() * 0.4 - 64);
        let $tocWidget = $('.toc-widget');
        $(window).scroll(function () {
            let scroll = $(window).scrollTop();
            /* add post toc fixed. */
            if (scroll > tocHeight) {
                $tocWidget.addClass('toc-fixed');
            } else {
                $tocWidget.removeClass('toc-fixed');
            }
        });

        
        /* 修复文章卡片 div 的宽度. */
        let fixPostCardWidth = function (srcId, targetId) {
            let srcDiv = $('#' + srcId);
            if (srcDiv.length === 0) {
                return;
            }

            let w = srcDiv.width();
            if (w >= 450) {
                w = w + 21;
            } else if (w >= 350 && w < 450) {
                w = w + 18;
            } else if (w >= 300 && w < 350) {
                w = w + 16;
            } else {
                w = w + 14;
            }
            $('#' + targetId).width(w);
        };

        // 切换TOC目录展开收缩的相关操作.
        const expandedClass = 'expanded';
        let $tocAside = $('#toc-aside');
        let $mainContent = $('#main-content');
        $('#floating-toc-btn .btn-floating').click(function () {
            if ($tocAside.hasClass(expandedClass)) {
                $tocAside.removeClass(expandedClass).hide();
                $mainContent.removeClass('l9');
            } else {
                $tocAside.addClass(expandedClass).show();
                $mainContent.addClass('l9');
            }
            fixPostCardWidth('artDetail', 'prenext-posts');
        });
        
    });
</script>

    

</main>




    <footer class="page-footer bg-color">
    

    <div class="container row center-align"
         style="margin-bottom: 15px !important;">
        <div class="col s12 m8 l8 copy-right">
            Copyright&nbsp;&copy;
            
                <span id="year">2021-2023</span>
            
            <a href="/about" target="_blank">Jack Wang</a>
            <!-- |&nbsp;Powered by&nbsp;<a href="https://hexo.io/" target="_blank">Hexo</a> -->
            <!-- |&nbsp;Theme&nbsp;<a href="https://github.com/blinkfox/hexo-theme-matery" target="_blank">Matery</a> -->
            <br>
            
                &nbsp;<i class="fas fa-chart-area"></i>&nbsp;站点总字数:&nbsp;<span
                        class="white-color">603.8k</span>
            
            
            
                
            
            
                <span id="busuanzi_container_site_pv">
                &nbsp;|&nbsp;<i class="far fa-eye"></i>&nbsp;总访问量:&nbsp;
                    <span id="busuanzi_value_site_pv" class="white-color"></span>
            </span>
            
            
                <span id="busuanzi_container_site_uv">
                &nbsp;|&nbsp;<i class="fas fa-users"></i>&nbsp;总访问人数:&nbsp;
                    <span id="busuanzi_value_site_uv" class="white-color"></span>
            </span>
            
            <br>

            <!-- 运行天数提醒. -->
            
                <span id="sitetime"> Loading ...</span>
                <script>
                    var calcSiteTime = function () {
                        var seconds = 1000;
                        var minutes = seconds * 60;
                        var hours = minutes * 60;
                        var days = hours * 24;
                        var years = days * 365;
                        var today = new Date();
                        var startYear = "2021";
                        var startMonth = "11";
                        var startDate = "12";
                        var startHour = "0";
                        var startMinute = "0";
                        var startSecond = "0";
                        var todayYear = today.getFullYear();
                        var todayMonth = today.getMonth() + 1;
                        var todayDate = today.getDate();
                        var todayHour = today.getHours();
                        var todayMinute = today.getMinutes();
                        var todaySecond = today.getSeconds();
                        var t1 = Date.UTC(startYear, startMonth, startDate, startHour, startMinute, startSecond);
                        var t2 = Date.UTC(todayYear, todayMonth, todayDate, todayHour, todayMinute, todaySecond);
                        var diff = t2 - t1;
                        var diffYears = Math.floor(diff / years);
                        var diffDays = Math.floor((diff / days) - diffYears * 365);

                        // 区分是否有年份.
                        var language = 'zh-CN';
                        if (startYear === String(todayYear)) {
                            document.getElementById("year").innerHTML = todayYear;
                            var daysTip = 'This site has been running for ' + diffDays + ' days';
                            if (language === 'zh-CN') {
                                daysTip = '本站已运行 ' + diffDays + ' 天';
                            } else if (language === 'zh-HK') {
                                daysTip = '本站已運行 ' + diffDays + ' 天';
                            }
                            document.getElementById("sitetime").innerHTML = daysTip;
                        } else {
                            document.getElementById("year").innerHTML = startYear + " - " + todayYear;
                            var yearsAndDaysTip = 'This site has been running for ' + diffYears + ' years and '
                                + diffDays + ' days';
                            if (language === 'zh-CN') {
                                yearsAndDaysTip = '本站已运行 ' + diffYears + ' 年 ' + diffDays + ' 天';
                            } else if (language === 'zh-HK') {
                                yearsAndDaysTip = '本站已運行 ' + diffYears + ' 年 ' + diffDays + ' 天';
                            }
                            document.getElementById("sitetime").innerHTML = yearsAndDaysTip;
                        }
                    }

                    calcSiteTime();
                </script>
            
            <br>
            
                <span id="icp"><img src="/medias/icp.png"
                                    style="vertical-align: text-bottom;"/>
                <a href="https://beian.miit.gov.cn" target="_blank">陕ICP备2021014294号-1</a>
            </span>
            
        </div>
        <div class="col s12 m4 l4 social-link social-statis">
    <a href="https://github.com/jackwang0108" class="tooltipped" target="_blank" data-tooltip="访问我的GitHub" data-position="top" data-delay="50">
        <i class="fab fa-github"></i>
    </a>



    <a href="mailto:2232123545@qq.com" class="tooltipped" target="_blank" data-tooltip="邮件联系我" data-position="top" data-delay="50">
        <i class="fas fa-envelope-open"></i>
    </a>







    <a href="tencent://AddContact/?fromId=50&fromSubId=1&subcmd=all&uin=2232123545" class="tooltipped" target="_blank" data-tooltip="QQ联系我: 2232123545" data-position="top" data-delay="50">
        <i class="fab fa-qq"></i>
    </a>







</div>
    </div>
</footer>

<div class="progress-bar"></div>


    <!-- 搜索遮罩框 -->
<div id="searchModal" class="modal">
    <div class="modal-content">
        <div class="search-header">
            <span class="title"><i class="fas fa-search"></i>&nbsp;&nbsp;搜索</span>
            <input type="search" id="searchInput" name="s" placeholder="请输入搜索的关键字"
                   class="search-input">
        </div>
        <div id="searchResult"></div>
    </div>
</div>

<script type="text/javascript">
$(function () {
    var searchFunc = function (path, search_id, content_id) {
        'use strict';
        $.ajax({
            url: path,
            dataType: "xml",
            success: function (xmlResponse) {
                // get the contents from search data
                var datas = $("entry", xmlResponse).map(function () {
                    return {
                        title: $("title", this).text(),
                        content: $("content", this).text(),
                        url: $("url", this).text()
                    };
                }).get();
                var $input = document.getElementById(search_id);
                var $resultContent = document.getElementById(content_id);
                $input.addEventListener('input', function () {
                    var str = '<ul class=\"search-result-list\">';
                    var keywords = this.value.trim().toLowerCase().split(/[\s\-]+/);
                    $resultContent.innerHTML = "";
                    if (this.value.trim().length <= 0) {
                        return;
                    }
                    // perform local searching
                    datas.forEach(function (data) {
                        var isMatch = true;
                        var data_title = data.title.trim().toLowerCase();
                        var data_content = data.content.trim().replace(/<[^>]+>/g, "").toLowerCase();
                        var data_url = data.url;
                        data_url = data_url.indexOf('/') === 0 ? data.url : '/' + data_url;
                        var index_title = -1;
                        var index_content = -1;
                        var first_occur = -1;
                        // only match artiles with not empty titles and contents
                        if (data_title !== '' && data_content !== '') {
                            keywords.forEach(function (keyword, i) {
                                index_title = data_title.indexOf(keyword);
                                index_content = data_content.indexOf(keyword);
                                if (index_title < 0 && index_content < 0) {
                                    isMatch = false;
                                } else {
                                    if (index_content < 0) {
                                        index_content = 0;
                                    }
                                    if (i === 0) {
                                        first_occur = index_content;
                                    }
                                }
                            });
                        }
                        // show search results
                        if (isMatch) {
                            str += "<li><a href='" + data_url + "' class='search-result-title'>" + data_title + "</a>";
                            var content = data.content.trim().replace(/<[^>]+>/g, "");
                            if (first_occur >= 0) {
                                // cut out 100 characters
                                var start = first_occur - 20;
                                var end = first_occur + 80;
                                if (start < 0) {
                                    start = 0;
                                }
                                if (start === 0) {
                                    end = 100;
                                }
                                if (end > content.length) {
                                    end = content.length;
                                }
                                var match_content = content.substr(start, end);
                                // highlight all keywords
                                keywords.forEach(function (keyword) {
                                    var regS = new RegExp(keyword, "gi");
                                    match_content = match_content.replace(regS, "<em class=\"search-keyword\">" + keyword + "</em>");
                                });

                                str += "<p class=\"search-result\">" + match_content + "...</p>"
                            }
                            str += "</li>";
                        }
                    });
                    str += "</ul>";
                    $resultContent.innerHTML = str;
                });
            }
        });
    };

    searchFunc('/search.xml', 'searchInput', 'searchResult');
});
</script>

    <!-- 回到顶部按钮 -->
<div id="backTop" class="top-scroll">
    <a class="btn-floating btn-large waves-effect waves-light" href="#!">
        <i class="fas fa-arrow-up"></i>
    </a>
</div>


    <script src="/libs/materialize/materialize.min.js"></script>
    <script src="/libs/masonry/masonry.pkgd.min.js"></script>
    <script src="/libs/aos/aos.js"></script>
    <script src="/libs/scrollprogress/scrollProgress.min.js"></script>
    <script src="/libs/lightGallery/js/lightgallery-all.min.js"></script>
    <script src="/js/matery.js"></script>

    

    
        
        <script type="text/javascript">
            // 只在桌面版网页启用特效
            var windowWidth = $(window).width();
            if (windowWidth > 768) {
                document.write('<script type="text/javascript" src="/libs/others/sakura.js"><\/script>');
            }
        </script>
    

    <!-- 雪花特效 -->
    

    <!-- 鼠标星星特效 -->
    

     
        <script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>
        <script src="/libs/others/TencentCaptcha.js"></script>
        <button id="TencentCaptcha" data-appid="xxxxxxxxxx" data-cbfn="callback" type="button" hidden></button>
    

    <!-- Baidu Analytics -->

    <!-- Baidu Push -->

<script>
    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        } else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>

    
    <script src="/libs/others/clicklove.js" async="async"></script>
    
    
    <script async src="/libs/others/busuanzi.pure.mini.js"></script>
    

    

    

    <!--腾讯兔小巢-->
    
    

    

    

    
    <script src="/libs/instantpage/instantpage.js" type="module"></script>
    

</body>

</html>
